package com.gollum.jpa.service;



import com.gollum.jpa.domain.Page;
import com.sun.crypto.provider.DESCipher;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;

import javax.persistence.LockModeType;
import java.io.Serializable;
import java.util.List;

/**
 * JpaService接口
 *
 * @author Herther
 * @version 1.0.0
 * @ClassName JpaServer.java
 * @createTime 2022年08月07日 17:54:00
 */
public interface JpaServer<T,ID extends Serializable> {

    /**
     * 功能描述: 分页查询 返回自定义Page对象
     *
     * @param specification 查询参数
     * @param page 分页条件
     * @return 对象集合
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/8/7 18:34
     */
    Page<T> findAllWithPage(Page<T> page, Specification<T> specification);

    /**
     * 功能描述: 分页查询 返回自定义Page对象
     *
     * @param page 分页条件
     * @return 对象集合
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/8/7 18:34
     */
    Page<T> findAllWithPage(Page<T> page);

    /**
     * 功能描述: 查询全部数据
     *
     * @param
     * @return
     * @auther: Herther
     * @since 1.0.0
     * @date: 2022/9/14 20:49
     */
    List<T> findAll();

    /**
     * 功能描述: 查询全部数据并排序
     *
     * @param sorts 约定好的排序字符串
     * @return List<T> 查找后的全部数据
     * @auther: Herther
     * @since 1.0.0
     * @date: 2022/9/14 20:49
     */
    List<T> findAll(Specification<T> specification,String sorts);

    List<T> findAll(String sorts);

    /**
     * 功能描述: 排序查找
     * @param sort 排序对象
     * @return 查找后的数据
     * @auther: Herther
     * @since 1.0.0
     * @date: 2022/9/14 20:51
     */
    List<T> findAll(Sort sort);

    /**
     * 条件加排序查询
     *
     * @auther: Herther
     * @since 1.0.0
     * @date: 2022/9/14 20:59
     */
    List<T> findAll(Specification<T> specification,Sort sort);


    /**
     * 功能描述: 根据ID查找实体 如果没找到则返回null
     *
     * @param id 主键 ID
     * @return  T 领域对象对应的entity
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/8/7 17:56
     */
    T getById(ID id);

    /**
     * 功能描述: 根据ID 加锁查询
     *
     * @param id 主键 ID
     * @param lockModeType 加锁类型
     * @return  T 领域对象对应的entity
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/8/7 17:56
     */
    T getByIdLock(ID id, LockModeType lockModeType);

    /**
     * 功能描述: 保存对象
     *
     * @param entity
     * @return 返回保存的对象
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/8/7 18:17
     */
    T save(T entity);


    /**
     * 功能描述: 批量保存对象
     *
     * @param entits 保存的对象集合
     * @return 保存后的对象
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/8/7 18:31
     */
    List<T> saveInBatch(Iterable<T> entitys);

    /**
     * 功能描述: 计算总记录数
     * @return 返回总记录数
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/8/7 18:20
     */
    long count();

    /**
     * 功能描述: 根据ID 判断当前对象是否存在  id 不能为空
     * @param id 主键 ID
     * @return 存在 true  不存在 false
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/8/7 18:27
     */
    boolean exits(ID id);

    /**
     * 功能描述: 判断当前对象是否是新数据
     *
     * @param entity 对象
     * @return
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/8/7 18:28
     */
    boolean isNew(T entity);


    /**
     * 根据ID删除
     *
     * @param id 主键
     * @auther: Herther
     * @since 1.0.0
     * @date: 2022/9/14 21:34
     */
    void removeById(ID id);

    /**
     * 传入实体删除
     *
     * @param entity 实体
     * @auther: Herther
     * @since 1.0.0
     * @date: 2022/9/14 21:41
     */
    void remove(T entity);

    /**
     * 传入实体集合删除
     *
     * @param entitys list实体
     * @return
     * @auther: Herther
     * @since 1.0.0
     * @date: 2022/9/14 21:41
     */
    void removeAll(Iterable<T> entitys);

    /**
     * 传入id数组批量删除
     *
     * @param ids id数组
     * @auther: Herther
     * @since 1.0.0
     * @date: 2022/9/14 21:42
     */
    void removeAllByIds(Iterable<ID> ids);

    boolean logic(ID id);


    ///**
    // * 功能描述: 根据ID逻辑删除删除
    // *
    // * @param id Id主键
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/7 18:21
    // */
    //void deleteById(ID id);
    //
    ///**
    // * 功能描述: 传入实体逻辑删除
    // *
    // * @param entity 实体
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/7 18:21
    // */
    //void delete(T entity);
    //
    //
    ///**
    // * 功能描述: 真实删除数据
    // *
    // * @param id id 主键
    // * @return
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/7 18:22
    // */
    //void noLogicDeleteById(ID id);
    //
    //
    ///**
    // * 功能描述: 根据ID逻辑批量删除
    // *
    // * @param ids id数组迭代器
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/7 18:21
    // */
    //void deleteById(Iterable<ID> ids);
    //
    ///**
    // * 功能描述: 根据ID真实u批量
    // * @param ids id数组迭代器
    // * @return
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/7 18:22
    // */
    //void deleteNoLogicById(Iterable<ID> ids);
    //
    //
    ///**
    // * 功能描述: 传入实体真实删除
    // * @param entity 实体对象
    // * @return
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/7 18:22
    // */
    //void deleteNoLogic(T entity);
    //
    ///**
    // * 功能描述: 批量逻辑删除
    // *
    // * @param entities 要删除的实体对象
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/7 18:25
    // */
    //void deleteAll(Iterable<T> entities);
    //
    ///**
    // * 功能描述: 批量真实删除
    // *
    // * @param entities 要删除的实体对象
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/7 18:25
    // */
    //void deleteNoLogicAll(Iterable<T> entities);
    //


}
